#coding: utf-8

'''
Created on 06/04/2009

@author: iuri.andreazza
'''

class Operador:
    
    '''
        @var __opName: Nome do Operador (ADD, ADDU, MUL ...)
    '''
    __opName = "";
    
    '''
        @var __operandos: Operandos do Operador
    '''
    __operandos = [];
    
    '''
        @var __comentario: Comentário da linha
    '''
    __comentario = "";
    
    '''
        Construtor padrão
        @author: iuri.andreazza
    '''
    def __init__(self):
        self.__opName = "";
        self.__operandos = [];
        self.__comentario = "";
        
    '''
        Construtor que possibiltia a definição do nome do operador;
        
        @param opName: Nome do Operador (ADD, ADDU, MUL ...)
        @author: iuri.andreazza
    '''
    def __init__(self, opName):
        self.__opName = opName;
        self.__operandos = [];
        self.__comentario = "";
    
    '''
        Construtor que possibilita a definição de todos os dados do operador
        
        @param opName: Nome do Operador (ADD, ADDU, MUL ...)
        @param operandos: Operandos do Operador
        @param comentario: Comentário da linha
    '''
    def __init__(self, opName, operandos, comentario):
        self.__opName = opName;
        self.__operandos = operandos;
        self.__comentario = comentario;    

    '''
        Getters and Setters
    '''

    def getOp(self):
        return self.__opName;
    
    def getOperandos(self):
        return self.__operandos;
    
    def getComentario(self):
        return self.__comentario;

'''
    Class que abstrai o Operador ADD
    
    @author: iuri.andreazza
'''
class ADD(Operador):
    '''
        Construtor do ADD.
        Esse construtor funciona para todos os ADDs (ADD,ADDU,ADDF);
        
        @author: iuri.andreazza
    '''
    def __init__(self, operandos, comentario, type = "ADD"):
        Operador.__init__(self, type, operandos, comentario);
        

class OR(Operador):
    '''
        Construtor do OR.
        Esse construtor funciona para todos os ORs (OR,XOR,NOR);
        
        @author: iuri.andreazza
    '''
    def __init__(self, operandos, comentario, type = "OR"):
        Operador.__init__(self, type, operandos, comentario);


class AND(Operador):
    '''
        Construtor do AND.
        Esse construtor funciona para todos os AND;
        
        @author: iuri.andreazza
    '''
    def __init__(self, operandos, comentario):
        Operador.__init__(self, "AND", operandos, comentario);

class NOT(Operador):
    '''
        Construtor do NOT.
        Esse construtor funciona para todos os NOT;
        
        @author: iuri.andreazza
    '''
    def __init__(self, operandos, comentario):
        Operador.__init__(self, "NOT", operandos, comentario);


class MUL(Operador):
    '''
        Construtor do MUL.
        Esse construtor funciona para todos os MULs (MUL,MULO,MULOU);
        
        @author: iuri.andreazza
    '''
    def __init__(self, operandos, comentario, type = "MUL"):
        Operador.__init__(self, type, operandos, comentario);

class SUB(Operador):
    '''
        Construtor do SUB.
        Esse construtor funciona para todos os SUBs (SUB,SUBU);
        
        @author: iuri.andreazza
    '''
    def __init__(self, operandos, comentario, type = "SUB"):
        Operador.__init__(self, type, operandos, comentario);


class LW(Operador):
    '''
        Construtor do LW.
        
        @author: iuri.andreazza
    '''
    def __init__(self, operandos, comentario):
        Operador.__init__(self, "LW", operandos, comentario);

class SW(Operador):
    '''
        Construtor do LW.
        
        @author: iuri.andreazza
    '''
    def __init__(self, operandos, comentario):
        Operador.__init__(self, "LW", operandos, comentario);